package com.etc

import org.apache.spark.mllib.linalg.{Matrices, Vectors}
import org.apache.spark.mllib.stat.{MultivariateStatisticalSummary, Statistics}
import org.apache.spark.{SparkConf, SparkContext}

/**
  * 基本统计
  *
  * 1. 摘要统计
  * 2. 相关性：  相关性度量  ，是一种研究变量之间线性相关程度的量   主要 是 皮尔逊相关系数
  *
  * 3. 分层抽样
  * 4. 假设检验:  根据一定的假设条件，由样本推断总体的一种统计学方法，基本的思路是先提出假设（虚无假设） ，使用
  *               统计学方法进行计算。根据计算的结果判断是否拒绝假设。
  *               假设检验的统计方法有很多,如 卡方检验 ，T 检验等
  *               spark实现的时皮尔森卡方检验，它可以实现适度检测和独立性检测
  *
  *               皮尔森卡方检验：  皮尔森卡方检验是最程勇干的卡方检验，可以分为适度检验和独立性检验
  *               适度检验： 验证观察值的次数分配与理论值是否相等
  * 5. 流媒体重要性测试
  * 6. 随机数据生成
  * 7. 核密度估计
  *
  *
  */
object BasicStatistics {

  /**
    *
    * @param args
    */
  def main(args: Array[String]): Unit = {

    Summarystatistics()
//    beijing()
//    pierxun()
//    Hypothesistesting()
  }


  /**
    * 摘要统计
    */
  def Summarystatistics(){

    val conf = new SparkConf().setAppName("observations").setMaster("local[*]")
    val spark = new SparkContext(conf)


    val observations = spark.parallelize(
      Seq(
        Vectors.dense(1.0, 10.0, 100.0),
        Vectors.dense(2.0, 20.0, 200.0),
        Vectors.dense(3.0, 30.0, 300.0)
      )
    )

    val summary:MultivariateStatisticalSummary = Statistics.colStats(observations)

    //平均
    println(summary.mean)
    //方差
    println(summary.variance)
    //非零元素数目
    println(summary.numNonzeros)


    spark.stop()
  }

  /**
    * 案列
    */


  def beijing(): Unit ={
    val conf = new SparkConf().setAppName("observations").setMaster("local[*]")
    val spark = new SparkContext(conf)


    val line = spark.textFile("f:\\beijing.txt")


    val data = line.flatMap(_.split(",")).map(value => Vectors.dense(value.toDouble))

    val summary = Statistics.colStats(data)

    //平均
    println("平均:" + summary.mean)
    //最大
    println("最大:" + summary.max)
    //最小
    println("最小：" + summary.min)


    spark.stop()
  }


  /**
    * 相关项  皮尔逊相关性
    */

  def pierxun(): Unit ={
    val conf = new SparkConf().setAppName("observations").setMaster("local[*]")
    val spark = new SparkContext(conf)


    val line = spark.textFile("f:\\beijing2.txt")


    val unit = line.flatMap(_.split(",")).map(_.toDouble)


    val yers = unit.filter(_ >= 1949 )

    val per = unit.filter( _ < 1949 )

    val correlation: Double = Statistics.corr(yers, per, "pearson")

    //Correlation is: -0.4385405496488065
    println(s"Correlation is: $correlation")

    spark.stop()
  }


  /**
    * 假设检验
    */
  def Hypothesistesting(){

    /**
      *
      *          男性      女性
      * 右里手   127       147
      * 左里手   19        10
       *

      *
      */
      //具体的数据矩阵
    val data = Matrices.dense(2,2,Array(127,19,147,10))

    val result = Statistics.chiSqTest(data)

    print(result.statistic)

    /**
      * 假设条件和 0.05 比  如果大于就肯定 小于就否定
      *
      */
    print(result.pValue)
  }

}
